package bil.download;

import bil.audio.Tocador;
import bil.imagem.Imagem;
import bil.imagem.ImagemModel;
import java.io.File;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import javax.swing.JOptionPane;
import javax.swing.JProgressBar;
import javax.swing.JTable;

/**
 *
 * @author Eduardo Folly
 */
public class Downloader implements Runnable {

    private JTable tabela;
    private JProgressBar barra;
    private Atualizador atua;
    private int qtdThreads;
    private int contador;
    private String pastaPadrao;

    public Downloader(JTable tabela, JProgressBar barra, String pastaPadrao, int qtdThreads, Atualizador atua) {
        this.tabela = tabela;
        this.barra = barra;
        this.qtdThreads = qtdThreads;
        this.atua = atua;
        this.pastaPadrao = pastaPadrao;

        File dir = new File(pastaPadrao);
        if (!(dir.exists() && dir.isDirectory())) {
            dir.mkdir();
        }
    }

    public void run() {
        ExecutorService tpes = Executors.newFixedThreadPool(qtdThreads);

        ImagemModel imagens = (ImagemModel) tabela.getModel();
        for (Imagem image : imagens.getListImagens()) {
            if (image.isSelected()) {
                contador++;
            }
            tpes.execute(new Download(this, image));
        }

        barra.setMinimum(0);
        barra.setMaximum(contador);
        barra.setValue(0);

        tpes.shutdown();
    }

    public void atualizaBarra() {
        contador--;
        barra.setValue(barra.getMaximum() - contador);
        if (contador == 0) {
            barra.setValue(0);
            atua.terminate();
            try {
                new Tocador(getClass().getResource("/bil/audio/game_over.wav").openStream()).start();
            } catch (Exception e) {
                e.printStackTrace();
            }
            JOptionPane.showMessageDialog(null, "Concluído.", "BIL", JOptionPane.INFORMATION_MESSAGE);
        }
    }

    public void velocidade(long tam) {
        atua.velocidade(tam);
    }

    public String getPastaPadrao() {
        return pastaPadrao;
    }
}
